package persistencia.dominio.testGrupos;

import persistencia.dominio.*;
import persistencia.Persistencia;
import server.Singleton;
import server.aula.ControlAula;
import server.grupo.ControlParticipanteGrupo;
import comun.constantes.*;

import java.io.*;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Vector;

public class TestRollback {
 static Persistencia persistencia = null;
 static Connection conexionSQL = null;
 //Aula y sus Comisiones para contraolar sus alumnos
 static Curso aulaPiloto = null;
 static Recurso recursoCalendario = null;
 static TipoPermiso tipoPermisoEscritura = null;
 static Anotador anotador = null;
 static TipoUsuario tipoUsuarioDocente = null;
 
 static public void initPersistencia(){
	  persistencia = new Persistencia();
	  persistencia.crearTransaccion();
	  //REGISTER DRIVER
	  try {
	      Driver d = (Driver)Class.forName(Singleton.driver).newInstance();
	  }catch (Exception e){
	      System.out.println(e);
	  }

	  //GET CONNECTION
	  conexionSQL=null;
	  try{
	      conexionSQL = DriverManager.getConnection(Singleton.url,Singleton.userName,Singleton.password);
	  }catch(Exception e){
	      System.out.println(e);
	  }
  }
 
  static public boolean commit(){
	 try {
		  persistencia.commit();
		  conexionSQL.close();
	      return true;
	  }catch(Exception ex){
		  ex.printStackTrace();
		  persistencia.rollback();
		  try{
		     conexionSQL.close();
		  }catch(SQLException ex1){
		      ex1.printStackTrace();
		      return false;
		  }
		     return false;
	  }
  }
 
  static public boolean rollback(){
	 try {
		 persistencia.rollback();
		 conexionSQL.close();
		 return true;
	 }catch (Exception ex){
		 ex.printStackTrace();
		 return false;
	 }
  }
  
  public static void verificacion(){
	  try{
		  initPersistencia(); 
		  System.out.println("=======================INICIO LA VERIFICACION==========================");
		  levantarDatosBD();
		  testearRollback();
		  System.out.println("======================TERMINO LA VERIFICACION==========================");
		  commit();
	  }catch(Exception ee){
			ee.printStackTrace();
			rollback();
	  }  
  }
  
  private static void levantarDatosBD()throws Exception{
		try{
			aulaPiloto = (Curso)persistencia.getObjectoPorId("persistencia.dominio.Curso",new Long(19738759));
			recursoCalendario = (Recurso)persistencia.getObjectosPorClaseYFiltro("persistencia.dominio.Recurso","nombre==\""+RECURSOS.CALENDARIO+"\" ").elementAt(0);
			tipoPermisoEscritura = (TipoPermiso)persistencia.getObjectosPorClaseYFiltro("persistencia.dominio.TipoPermiso","descripcion==\""+TIPO_PERMISOS.ESCRITURA+"\" ").elementAt(0);
			tipoUsuarioDocente = (TipoUsuario)persistencia.getObjectosPorClaseYFiltro("persistencia.dominio.TipoUsuario","nombre==\""+TIPO_USUARIOS.DOCENTE+"\" ").elementAt(0);
		}catch(Exception ee){
			ee.printStackTrace();
			throw ee;
		}	
  }
  
  private static void testearRollback(){
	    anotador = new Anotador();
	    persistencia.hacerPersistente(anotador);
	    
	    //Esto me deberia tirar "Duplicate ...", por lo tanto el Anotador de arriba no se me deberia cargar por el Rollback...
	    PermisoAcceso permisoAcceso = new PermisoAcceso();
	    persistencia.hacerPersistente(permisoAcceso);
	    permisoAcceso.setRecurso(recursoCalendario);
	    permisoAcceso.setTipoPermiso(tipoPermisoEscritura);
	    permisoAcceso.setAula(aulaPiloto);
	    permisoAcceso.setTipoUsuario(tipoUsuarioDocente);
 }
  
  public static void main(String[] args){
		verificacion();
  }
}